//
//  NSObject+Runtime.h
//  高仿暴走斗图
//
//  Created by huangsongyao on 16/3/7.
//  Copyright © 2016年 huangsongyao. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <objc/runtime.h>
#import "NSObject+Property.h"

@interface NSObject (Runtime)

/**
 *  利用runtime过滤为nil的属性，若存在nil的情况则重置为字符串“NONE”
 *
 *  @param info    过滤对象
 *  @param classes 过滤对象的类名
 */
- (void)checkObjectPropertyWithInfo:(id)info classes:(Class)classes;

/**
 *  runtime获取实例对象的所有的非nil属性
 *
 *  @param info    info实例对象
 *
 *  @return info对象的非nil属性的集合
 */
- (NSMutableArray *)getObjectAllPropertyWithInfo:(id)info;

/**
 *  runtime获取实例对象的类名，若info=nil时，返回的是NSError的类名，因此此方法不适应NSError
 *
 *  @param info    info实例对象
 *
 *  @return info对象的类名
 */
+ (Class)getObjectClassForInfo:(id)info;

/**
 *  获取私有api，返回一个私有api集合
 *
 *  @param classes 私有api的类
 *
 *  @return 私有api的集合
 */
- (NSMutableArray *)getPrivateAPIForClasses:(Class)classes;

/**
 *  通过方法名转换为对应的方法
 *
 *  @param methodName 方法名
 *
 *  @return SEL方法
 */
- (SEL)getClassMethodForMethodName:(NSString *)methodName;

/**
 *  反映射json抽象体为对象
 *
 *  @param info json抽象体
 *
 *  @return 反映射后的字典对象
 */
+ (id)antiMappingDictionaryToJsonWithInfo:(id)info;

/**
 *  用第二个方法替换第一个方法
 *
 *  @param action    第一个方法的方法名
 *  @param anoAction 第二个方法的方法名
 */
- (void)method_exchangeImpForAction:(SEL)action anotherAction:(SEL)anoAction;
+ (void)method_exchangeImpForAction:(SEL)action anotherAction:(SEL)anoAction;

/**
 *  给一个已知类添加一个类方法
 *
 *  @param aSEL  aSEL
 *  @param name  要添加的类方法名
 *  @param types types
 *
 *  @return 布尔值，YES成功，NO失败
 */
+ (BOOL)addClassMethod:(SEL)aSEL methodName:(NSString *)name types:(const char *)types;

/**
 *  给一个已知类添加一个实例方法
 *
 *  @param aSEL  aSEL
 *  @param name  要添加的实例方法名
 *  @param types types
 *
 *  @return 布尔值，YES成功，NO失败
 */
+ (BOOL)addInstanceMethod:(SEL)aSEL methodName:(NSString *)name types:(const char *)types;

@end
